package gold.gold02;


/**
 * 二进制, 与或
 * 二进制数的处理也是一个重要的东西。
 * 使用位移操作, 或者创造个什么数出来取与操作也可以。
 */

class S0501插入_按二进制插入 {
    // 100, 关于负数的补码一头雾水, 看多了有点乱。
    public int insertBits(int N, int M, int i, int j) {
        // 这里的>>>(j+1)应该分开, 可以避免>>>32被无效的情况
        int a = (((N>>>j)>>>1)<<j)<<1;
        // 同样的, 当i=0的时候, <<32也被无效了, 做个判断来解决。
        int b = i == 0? 0: (N<<(32-i))>>>(32-i);
        int c = M<<i;
        int result = a + b + c;
        return result;
    }

    /**
     * 100, 二进制, ~是二进制取反符号
     */
    public int insertBits2(int N, int M, int i, int j) {
        int mask = 1; // 类似于掩码
        int maskLen = j - i;
        while(maskLen -- > 0){
            mask = (mask << 1) + 1;
        }
        mask <<= i;
        M <<= i;
        return N & ~mask | M;
    }
}